package linker

import (
	"debug/elf"
	"strings"
)

var prefixes = []string{
	".text.", ".data.rel.ro.", ".data.", ".rodata.", ".bss.rel.ro.", ".bss.",
	".init_array.", ".fini_array.", ".tbss.", ".tdata.", ".gcc_except_table.",
	".ctors.", ".dtors.",
}

// GetOutPutName 把 InputSection 的Name 转换成 OutPutSection 的 Name
// 通过名字来进行映射
func GetOutPutName(name string, flags uint64) string {
	// && 运算符优先级高于 &
	// 这里主要处理可以被合并的 read only 节 尤其是包含字符串的节
	if name == ".rodata" || strings.HasPrefix(name, ".rodata.") && flags&uint64(elf.SHF_MERGE) != 0 {
		if flags&uint64(elf.SHF_STRINGS) != 0 {
			// 字符串
			return ".rodata.str"
		} else {
			// 常量
			return ".rodata.cst"
		}
	}

	for _, prefix := range prefixes {
		item := prefix[:len(prefix)-1]
		if item == name || strings.HasPrefix(name, prefix) {
			return item
		}
	}

	// 没有在已知的前缀表中的直接返回 不做任何处理
	return name
}
